# 作者: 王道 龙哥
# 2024年06月13日16时37分32秒
# dartou@qq.com
class Hash:
    def __init__(self, hash_table_size):
        self.hash_table = [None] * hash_table_size  # 初始化哈希表
        self.hash_table_size = hash_table_size  # 哈希表大小

    def elf_hash(self, hash_str):
        h = 0
        g = 0
        for i in hash_str:
            h = (h << 4) + ord(i)
            g = h & 0xf0000000
            if g:
                h ^= g >> 24
            h &= ~g
        return h % self.hash_table_size


if __name__ == '__main__':
    import random

    str_list = ["xiongda", "lele", "hanmeimei", "wangdao", "fenghua"]
    # 把上面str_list中的字符串变为字典类型，并生成新的列表
    stu_list = []
    temp_dict = {}
    for i in str_list:
        temp_dict.clear()
        temp_dict['name'] = i
        temp_dict['age'] = random.randint(1, 100)
        stu_list.append(temp_dict.copy())

    print(stu_list)
    h = Hash(10)  # 初始化哈希对象
    for stu in stu_list:
        index = h.elf_hash(stu['name'])  # 通过哈希函数计算索引
        if h.hash_table[index] is None:  # 如果索引为空，则直接插入
            h.hash_table[index] = [stu]  # 存储时，直接封装为列表格式
        else:
            print('哈希冲突，开始解决')
            h.hash_table[index].append(stu)
    # 找到哈希表中对应的学生信息
    stu_name = input('请输入学生姓名：')
    index = h.elf_hash(stu_name)  # 通过哈希函数计算索引
    # 查询对应姓名的学生信息,针对有哈希冲突的如何进行哈希查找
    for stu in h.hash_table[index]:
        if stu['name'] == stu_name:
            print(f'找到了{stu}')
            break
